﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CDSBDemandControl.Presenter;
using CDSBDemandControl.Model;
using System.Web.UI.HtmlControls;

namespace CDSBDemandControl.View.Web
{
    public partial class WebForm1 : System.Web.UI.Page, IDiscriminatorDemand
    {
        private Presenter.DiscriminatorDemand Presenter;

        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Cache.SetExpires(DateTime.Now.Subtract(new TimeSpan(24, 0, 0)));
            Response.Cache.SetCacheability(HttpCacheability.NoCache);

            if (!this.IsPostBack || this.Session["Presenter"] == null)
            {
                this.Presenter = new DiscriminatorDemand(this);

                this.Session["Presenter"] = this.Presenter;

                if (!this.IsPostBack) this.ListarFila();
            }
            else
            {
                this.Presenter = (Presenter.DiscriminatorDemand)this.Session["Presenter"];
                this.Presenter.ResetView(this);
            }
        }

        private void ListarFila()
        {
            this.ConfigurarFiltros(Filtros.Projetos);
            this.Presenter.ListWorkItensRow(this.RecuperarFiltroProjeto());
        }

        private void ConfigurarFiltros(Filtros filtro)
        {
            switch (filtro)
            {
                case Filtros.Fabricas:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = true;
                    this.spanFiltroProjetos.Visible = false;
                    break;
                case Filtros.Projetos:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = false;
                    this.spanFiltroProjetos.Visible = true;
                    break;
                case Filtros.Todos:
                    this.TblFiltro.Visible = true;
                    this.spanFiltroFabrica.Visible = true;
                    this.spanFiltroProjetos.Visible = true;
                    break;
                case Filtros.Nenhum:
                    this.TblFiltro.Visible = false;
                    break;
            }
        }

        private FiltroProjeto RecuperarFiltroProjeto()
        {
            switch (this.cmbFiltroProjeto.SelectedValue)
            {
                case "SiteBVMF":
                    return FiltroProjeto.SiteBVMF;
                case "Sinacor":
                    return FiltroProjeto.Sinacor;
                case "iMercado":
                    return FiltroProjeto.iMercado;
                default:
                    return FiltroProjeto.Todos;
            }
        }

        public void ExibirFila(IEnumerable<DemandModel> demandModels)
        {
            // Binding
            this.GrdFila.DataSource = demandModels;
            this.GrdFila.DataBind();

            string Mensagem = GrdFila.Rows.Count > 0 ? string.Empty : "Não há WorkItens em Fila.";

            // Exibe Mensagem quando não houver dados na Grid
            this.ValidarGridSemResultado(Mensagem, string.Empty);

            // Exibe número total de registros
            this.ExibirTotalRegistro(GrdFila.Rows.Count, "{0} WorkItem{1} em Fila", GrdFila.Rows.Count > 1 ? "s" : string.Empty);

            // Insere texto explicativo de Esteira
            this.ExibirObservacao("Ordenado pela Data de Entrada na Fila.");

            // Exibe a data da última atualização
            (this.Master.FindControl("LblUltimoUpdate") as Label).Text = "Última atualização em: " + this.Presenter.DemandListLastUpdate.ToShortDateString() + " as " + this.Presenter.DemandListLastUpdate.ToShortTimeString();

            (this.Master.FindControl("txtTimeToCompare") as HtmlGenericControl).InnerHtml =
                this.Presenter.DemandListLastUpdate.Year + "," +
                (this.Presenter.DemandListLastUpdate.Month - 1) + "," +
                this.Presenter.DemandListLastUpdate.Day + "," +
                this.Presenter.DemandListLastUpdate.Hour + "," +
                this.Presenter.DemandListLastUpdate.Minute + "," +
                this.Presenter.DemandListLastUpdate.Second;
            
        }

        private void ValidarGridSemResultado(string msgSemResultado1, string msgSemResultado2)
        {
            this.lblMsgSemResultados1.Visible = (msgSemResultado1.Length > 0);
            this.lblMsgSemResultados1.Text = msgSemResultado1;            
        }

        private void ExibirTotalRegistro(int count, string texto, string plural)
        {
            this.lblTotalRegistros1.Visible = count > 0 ? true : false;
            this.lblTotalRegistros1.Text = string.Format(texto, count, plural);
        }

        private void ExibirObservacao(string obs)
        {
            this.LblObsOrdenacao.Text = obs;
            this.LblObsOrdenacao.Visible = this.LblObsOrdenacao.Text.Length > 0 ? true : false;
        }

        protected void CmbFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            FiltrarDados();
        }

        private void FiltrarDados()
        {
            this.ListarFila();            
        }

        protected void Grid_DataBinding(object sender, EventArgs e)
        {
            ((GridView)sender).Visible = true;
        }

        #region IDiscriminatorDemand Members

        void IDiscriminatorDemand.ExibirEsteira(IEnumerable<DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirRanking(IEnumerable<DeveloperModel> developers, IEnumerable<DeveloperModel> leaders, IEnumerable<DeveloperModel> focalpoints)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirAtrasos(IEnumerable<DemandModel> PendingDemands, IEnumerable<DemandModel> Concludeddemands)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirFaturamento(List<BillingModel> billing, bool canSeeBilling)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirCodeReview(IEnumerable<DemandModel> WorkItemsWithCodeReview, IEnumerable<DemandModel> WorkItemsWithoutCodeReview)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirBugsdeProducao(IEnumerable<DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirListaDisp(IEnumerable<DemandModel> list, IEnumerable<DeveloperModel> modelAusencias, List<DateTime> fer)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirBugsdeProducaoUltimoMes(List<DemandModel> BugList)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirFactoryWaitingList(List<BillingModel> Billing, bool AllowsShow)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirAlocacao(IEnumerable<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirFactoryProductionList(List<BillingModel> billing, bool canSeeBilling)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirSolicitacoesSites(List<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirManagementTeamTasks(List<CDSBDemandControl.Model.DemandModel> demandModels)
        {
            throw new NotImplementedException();
        }

        void IDiscriminatorDemand.ExibirScenariosAndTasks(List<CDSBDemandControl.Model.ScenarioModel> scenarios)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}
